/**
 * @description 函数防抖 Hook
 * @param fn 需要防抖的函数
 * @param delay 防抖延迟时间（毫秒，默认 500ms）
 * @returns 防抖后的函数
 */

import { useEffect, useRef, useCallback } from "react";

// T extends (...args: any[]) => any：这是一个泛型类型约束，表示 T 必须是一个函数类型
function useDebounce<T extends (...args: any[]) => any>(
  fn: T,
  delay: number = 500
): (...args: Parameters<T>) => void {
  const timerRef = useRef<NodeJS.Timeout>();

  // 使用 useCallback 缓存防抖函数，避免每次渲染都生成新函数
  const debouncedFn = useCallback(
    (...args: Parameters<T>) => {
      if (timerRef.current) {
        clearTimeout(timerRef.current);
      }
      timerRef.current = setTimeout(() => {
        fn(...args);
      }, delay);
    },
    [fn, delay]
  );

  // 组件卸载时清除定时器
  useEffect(() => {
    return () => {
      if (timerRef.current) {
        clearTimeout(timerRef.current);
      }
    };
  }, []);

  return debouncedFn;
}

export default useDebounce;
